﻿namespace Foggy.Data
{
    using System.Data.Entity;

    using Foggy.Data.Settings;
    using Foggy.Data.Users;

    /// <summary>
    /// Foggy context
    /// </summary>
    public class FoggyContext : DbContext
    {
        /// <summary>
        /// The database file name
        /// </summary>
        private const string DatabaseFileName = "Foggy.sdf";

        /// <summary>
        /// Database connection string
        /// </summary>
        private const string ConnectionStringFormatString =
            @"Data Source={0}\{1};Encrypt Database=True;Password='foggy';File Mode=read write;Persist Security Info=False;";

        /// <summary>
        /// Initializes a new instance of the <see cref="FoggyContext"/> class.
        /// </summary>
        public FoggyContext() : base(ConnectionString)
        {            
        }

        /// <summary>
        /// Gets or sets the data directory.
        /// </summary>
        /// <value>The data directory.</value>
        public static string DataDirectory { get; set; }

        /// <summary>
        /// Gets or sets the settings.
        /// </summary>
        /// <value>
        /// The settings.
        /// </value>
        public DbSet<SettingDto> Settings { get; set; }

        /// <summary>
        /// Gets or sets the users.
        /// </summary>
        /// <value>
        /// The users.
        /// </value>
        public DbSet<UserDto> Users { get; set; }

        /// <summary>
        /// Gets the connection string.
        /// </summary>
        /// <value>The connection string.</value>
        private static string ConnectionString
        {
            get
            {
                var connectionString =
                    string.Format(
                        ConnectionStringFormatString,
                        DataDirectory,
                        DatabaseFileName);

                return connectionString;
            }
        }

        /// <summary>
        /// This method is called when the model for a derived context has been initialized, but
        /// before the model has been locked down and used to initialize the context.  The default
        /// implementation of this method does nothing, but it can be overridden in a derived class
        /// such that the model can be further configured before it is locked down.
        /// </summary>
        /// <param name="modelBuilder">The builder that defines the model for the context being created.</param>
        /// <remarks>
        /// Typically, this method is called only once when the first instance of a derived context
        /// is created.  The model for that context is then cached and is for all further instances of
        /// the context in the app domain.  This caching can be disabled by setting the ModelCaching
        /// property on the given ModelBuidler, but note that this can seriously degrade performance.
        /// More control over caching is provided through use of the DbModelBuilder and DbContextFactory
        /// classes directly.
        /// </remarks>
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new SettingsConfiguration());
            modelBuilder.Configurations.Add(new UserConfiguration());
        }
    }
}